home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / ENEMY.C < prev    next >
Text File  |  2000-03-30  |  11KB  |  445 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.H>
  4. #include <XSP2lib.H>
  5. */
  6. /*short deb=0;*/
  7.  
  8. /*
  9.  *        enemy & eshot functions
  10.  */
  11.  
  12. #include "SPASSION.H"
  13. #include "PLAYER.H"
  14. #include "SHOT.H"
  15. #include "ENEMY.H"
  16. #include "ENTRY.H"
  17. #include "SOUND.H"
  18. #include "SUB.H"
  19. #ifndef NULL
  20. #define NULL ((void *) 0)
  21. #endif
  22.  
  23.  
  24. #define FLUSH_MAX    1                /* ダメージで光る時間 */
  25. #define ENEMY_MAX    128                /* 画面上に出る敵の数 */
  26.  
  27. #define PLAYER_DAMAGE             2    /* プレイヤー無敵時に体当たりで与えるダメージ */
  28. #define PLAYER_OPTION_DAMAGE     1    /* オプションの体当たりで与えるダメージ */
  29.  
  30.  
  31. static ENEMY enemy[ ENEMY_MAX ];
  32.  
  33. /* enemy_alloc()用 */
  34. static ENEMY *enemy_free,
  35.  *enemy_top;
  36.  
  37. /* FuncEnemy/ 以下の敵移動ルーチン */
  38. void InitEnemyZako00(ENEMY *);
  39. void InitEnemyZako01(ENEMY *);
  40. void InitEnemyZako02(ENEMY *);
  41. void InitEnemyZako03(ENEMY *);
  42. void InitEnemyZako04(ENEMY *);
  43. void InitEnemyZako05(ENEMY *);
  44. void InitEnemyHatch(ENEMY *ene);
  45. void InitEnemyBattery(ENEMY *ene);
  46. void InitEnemyVolcano(ENEMY *ene);
  47. void InitEnemyRock(ENEMY *ene);
  48. void InitEnemyMine(ENEMY *ene);
  49. void InitEnemyCrystal_L(ENEMY *ene);
  50. void InitEnemyCrystal_M(ENEMY *ene);
  51. void InitEnemyCrystal(ENEMY *ene);
  52. void InitEnemyBubble_L(ENEMY *ene);
  53. void InitEnemyBubble(ENEMY *ene);
  54. void InitEnemyBrain(ENEMY *ene);
  55. void InitEnemyBossM00(ENEMY *);
  56. void InitEnemyBossM01(ENEMY *);
  57. void InitEnemyDragonHead(ENEMY *);
  58. void InitEnemyDragonBody(ENEMY *);
  59. void InitEnemyBoss01(ENEMY *);
  60. void InitEnemyBoss02(ENEMY *);
  61. void InitEnemyBoss03(ENEMY *);
  62. void InitEnemyBoss04(ENEMY *);
  63. void InitEnemyLBoss(ENEMY *);
  64. void InitEnemyBossArm(ENEMY *);
  65. void InitEnemyBossArm1(ENEMY *);
  66. void InitEnemyCore(ENEMY *ene);
  67. void InitEnemyShield(ENEMY *ene);
  68. void InitEnemyLCore(ENEMY *);
  69. void InitEnemyLBattery1(ENEMY *);
  70. void InitEnemyLBattery2(ENEMY *);
  71. void InitEnemyLBattery3(ENEMY *);
  72. void InitItem(ENEMY *ene);
  73.  
  74.  
  75. void InitEnemyZako00Hit( void );
  76. void InitEnemyZako01Hit( void );
  77. void InitEnemyZako02Hit( void );
  78. void InitEnemyZako03Hit( void );
  79. void InitEnemyZako04Hit( void );
  80. void InitEnemyZako05Hit( void );
  81. void InitEnemyHatchHit( void );
  82. void InitEnemyBatteryHit( void );
  83. void InitEnemyVolcanoHit( void );
  84. void InitEnemyRockHit( void );
  85. void InitEnemyMineHit( void );
  86. void InitEnemyCrystal_LHit( void );
  87. void InitEnemyCrystal_MHit( void );
  88. void InitEnemyCrystalHit( void );
  89. void InitEnemyBubble_LHit( void );
  90. void InitEnemyBubbleHit( void );
  91. void InitEnemyBrainHit( void );
  92. void InitEnemyBossM00Hit( void );
  93. void InitEnemyBossM01Hit( void );
  94. void InitEnemyDragonHeadHit( void );
  95. void InitEnemyDragonBodyHit( void );
  96. void InitEnemyBoss01Hit( void );
  97. void InitEnemyBoss02Hit( void );
  98. void InitEnemyBoss03Hit( void );
  99. void InitEnemyBoss04Hit( void );
  100. void InitEnemyLBossHit( void );
  101. void InitEnemyBossArmHit( void );
  102. void InitEnemyBossArm1Hit( void );
  103. void InitEnemyCoreHit( void );
  104. void InitEnemyShieldHit( void );
  105. void InitEnemyLCoreHit( void );
  106. void InitEnemyLBattery1Hit( void );
  107. void InitEnemyLBattery2Hit( void );
  108. void InitEnemyLBattery3Hit( void );
  109. void InitItemHit( void );
  110.  
  111. typedef void (*func_init) (struct ENEMY *);
  112. func_init FuncEnemyInit[]=
  113. {
  114.     InitEnemyZako00,
  115.     InitEnemyZako01,
  116.     InitEnemyZako02,
  117.     InitEnemyZako03,
  118.     InitEnemyZako04,
  119.     InitEnemyZako05,
  120.     InitEnemyHatch,
  121.     InitEnemyBattery,
  122.     InitEnemyVolcano,
  123.     InitEnemyRock,
  124.     InitEnemyMine,
  125.     InitEnemyCrystal_L,
  126.     InitEnemyCrystal_M,
  127.     InitEnemyCrystal,
  128.     InitEnemyBubble_L,
  129.     InitEnemyBubble,
  130.     InitEnemyBrain,
  131.     InitEnemyBossM00,
  132.     InitEnemyBossM01,
  133.     InitEnemyDragonHead,
  134.     InitEnemyDragonBody,
  135.     InitEnemyBoss01,
  136.     InitEnemyBoss02,
  137.     InitEnemyBoss03,
  138.     InitEnemyBoss04,
  139.     InitEnemyLBoss,
  140.     InitEnemyBossArm,
  141.     InitEnemyBossArm1,
  142.     InitEnemyCore,
  143.     InitEnemyShield,
  144.     InitEnemyLCore,
  145.     InitEnemyLBattery1,
  146.     InitEnemyLBattery2,
  147.     InitEnemyLBattery3,
  148.     InitItem,
  149. };
  150. typedef void (*func_init_hit) (void);
  151. func_init_hit FuncEnemyHitInit[]=
  152. {
  153.     InitEnemyZako00Hit,
  154.     InitEnemyZako01Hit,
  155.     InitEnemyZako02Hit,
  156.     InitEnemyZako03Hit,
  157.     InitEnemyZako04Hit,
  158.     InitEnemyZako05Hit,
  159.     InitEnemyHatchHit,
  160.     InitEnemyBatteryHit,
  161.     InitEnemyVolcanoHit,
  162.     InitEnemyRockHit,
  163.     InitEnemyMineHit,
  164.     InitEnemyCrystal_LHit,
  165.     InitEnemyCrystal_MHit,
  166.     InitEnemyCrystalHit,
  167.     InitEnemyBubble_LHit,
  168.     InitEnemyBubbleHit,
  169.     InitEnemyBrainHit,
  170.     InitEnemyBossM00Hit,
  171.     InitEnemyBossM01Hit,
  172.     InitEnemyDragonHeadHit,
  173.     InitEnemyDragonBodyHit,
  174.     InitEnemyBoss01Hit,
  175.     InitEnemyBoss02Hit,
  176.     InitEnemyBoss03Hit,
  177.     InitEnemyBoss04Hit,
  178.     InitEnemyLBossHit,
  179.     InitEnemyBossArmHit,
  180.     InitEnemyBossArm1Hit,
  181.     InitEnemyCoreHit,
  182.     InitEnemyShieldHit,
  183.     InitEnemyLCoreHit,
  184.     InitEnemyLBattery1Hit,
  185.     InitEnemyLBattery2Hit,
  186.     InitEnemyLBattery3Hit,
  187.     InitItemHit,
  188. };
  189.  
  190.  
  191.  
  192. /*
  193.  *        敵・敵弾・データの初期化
  194.  */
  195. void InitEnemy( void )
  196. {
  197.     short    i;
  198.  
  199.     enemy_top = NULL;
  200.     enemy_free = enemy;
  201.     for( i = 0; i < ENEMY_MAX; i++ ){
  202.         enemy[i].next = &enemy[i + 1];
  203.         enemy[i].pre = &enemy[i - 1];
  204.     }
  205.     enemy[ 0 ].pre = NULL;
  206.     enemy[ENEMY_MAX - 1].next = NULL;
  207. }
  208.  
  209. /*
  210.  *        敵・敵弾・当たり判定データの初期化
  211.  *        起動時に一度だけ使う
  212.  */
  213. void InitEnemyHit( void )
  214. {
  215.     short type;
  216.  
  217.     for(type=0;type<=ITEM;type++){
  218.         FuncEnemyHitInit[type]();/* 初期化ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  219.     }
  220. }
  221.  
  222. /*
  223.  *        敵出現時に呼ばれる
  224.  */
  225. ENEMY *MakeEnemy(short type, signed short x, signed short y,
  226.           short arg, struct ENEMY *parent)
  227. {
  228.     ENEMY *ene;
  229.  
  230.     /* 空いているか調べる */
  231.     if ( !enemy_free ) return (ENEMY *)0;
  232.  
  233.     /* 空いているのを探す */
  234.     ene = enemy_free;
  235.     enemy_free = ene->next;
  236.  
  237.     /* 使っているリストに入れる */
  238.     if( ene->next = enemy_top ){
  239.         enemy_top->pre = ene;
  240.     }
  241.     ene->pre = 0;
  242.     enemy_top = ene;
  243.  
  244.     /* 各種設定 */
  245.     ene->lx                = x << 16;
  246.     ene->ly                = y << 16;
  247.     ene->type            = type;
  248.     ene->arg            = arg;
  249.     ene->damage            = 0;
  250.     ene->damage_kind    = 0;
  251.     ene->count            = 0;
  252.     ene->dead_count        = 0;
  253.     ene->flush_count    = 0;
  254.     ene->anim_count        = 0;
  255.     ene->state            = 0;
  256.     ene->angle            = 0;
  257.     ene->flg            = 0;
  258.  
  259.     ene->parent            = parent;
  260.     ene->child_kill        = ene->child_death = 0;
  261.     FuncEnemyInit[type](ene);/* 初期化ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  262.  
  263.     return(ene);        /* 作成したワークへのポインタを返す */
  264. }
  265.  
  266. /*
  267.  *        敵移動メイン
  268.  */
  269.  
  270. void MoveEnemy( void )
  271. {
  272.     PLAYER    *pl;
  273.     SHOT    *shot = shot_top;    /* 現在注目しているショットのワーク */
  274.     ENEMY    *ene;
  275.     short    hit_flag=0;
  276.  
  277.     ene = enemy_top;        /* 現在注目しているワーク */
  278.     while( ene ){
  279. #ifdef DEBUG
  280.         if( !ene->func_enemy_move ){            /* 敵の移動ルーチンがない? */
  281.             void game_end( void );
  282.             printf("MoveEnemy 1\n");
  283.             key_wait();
  284.             game_end();
  285.         }
  286. #endif
  287.         if ( !( *( ene->func_enemy_move ) )( ene ) ) {            /* 敵を移動させる */
  288.             ene=EraseEnemy( ene );
  289.         } else {                                                /* 消滅していない時 */
  290.             signed short    pl_x,pl_y,i,j,k;
  291.             signed short    hitp_x1,hitp_x2,hitp_y1,hitp_y2;
  292.             signed short    hito_x1,hito_x2,hito_y1,hito_y2;
  293.             signed short    hits_x1,hits_x2,hits_y1,hits_y2;
  294. /* D キーで当たり判定をしない(デバッグ用) */
  295. /*#ifdef DEBUG*/
  296. #if 0
  297. {
  298.     if( BITSNS(0x04) & BIT(0) ){
  299.         while( BITSNS(0x04) & BIT(0) );
  300.         if(deb)deb=0;
  301.         else deb=1;
  302.     }
  303. /*
  304.     if(deb){
  305.         ene = ene->next;
  306.         continue;
  307.     }
  308. */
  309. }
  310. #endif
  311.             for( k=0;ene->hit_p[k];k++ ){
  312.                 hitp_x1 = ENE_X+ene->hit_p[k]->x1;hitp_y1 = ENE_Y+ene->hit_p[k]->y1;
  313.                 hitp_x2 = ENE_X+ene->hit_p[k]->x2;hitp_y2 = ENE_Y+ene->hit_p[k]->y2;
  314.                 hito_x1 = ENE_X+ene->hit_o[k]->x1;hito_y1 = ENE_Y+ene->hit_o[k]->y1;
  315.                 hito_x2 = ENE_X+ene->hit_o[k]->x2;hito_y2 = ENE_Y+ene->hit_o[k]->y2;
  316.                 hits_x1 = ENE_X+ene->hit_s[k]->x1;hits_y1 = ENE_Y+ene->hit_s[k]->y1;
  317.                 hits_x2 = ENE_X+ene->hit_s[k]->x2;hits_y2 = ENE_Y+ene->hit_s[k]->y2;
  318.  
  319.                 for( i=0,pl=&player[0];i<=play_mode;i++,pl++ ){
  320.                     /* プレイヤーとの当たり判定 */
  321.                     /* プレイヤーは一度敵に当たったら、そのターンは他の敵とは判定しない
  322.                     そうしないと触れていない泡に当たっていることになってしまう*/
  323.                     if( !hit_flag ){
  324.                         pl_x=pl->x+5;
  325.                         pl_y=pl->y;
  326.                         if( hitp_x1 < pl_x ){
  327.                         if( hitp_x2 > pl_x ){
  328.                         if( hitp_y1 < pl_y ){
  329.                         if( hitp_y2 > pl_y ){
  330. #if 1
  331. /*                        if(!deb){*/
  332.                         if( !ene->no_dead ){
  333.                             if( pl->state == PLAYER_ALIVE ){
  334.                                 if( !pl->muteki_count )
  335.                                     pl->state = PLAYER_DEAD;        /* プレイヤー撃破 */
  336.                             }
  337.                         }
  338. /*                        }*/
  339. #endif
  340.                             hit_flag=1;
  341.                             ene->damage += PLAYER_DAMAGE;
  342.                             ene->player=pl;                        /* ダメージを与えたプレイヤー */
  343.                             ene->damage_kind=PLAYER_ATTACK;        /* 体当たり */
  344. #if 0
  345.                             B_CLR_AL();
  346.                             printf("PLAYER_HIT!! %d   \n",k);
  347.                             printf("i=%d px=%d py=%d    \n",i,pl->x+5,pl->y);
  348.                             printf("e_x=%d e_x1=%d e_x2=%d  \n",ENE_X,ene->hit_p[k]->x1,ene->hit_p[k]->x2);
  349.                             printf("e_y=%d e_y1=%d e_y2=%d  \n",ENE_Y,ene->hit_p[k]->y1,ene->hit_p[k]->y2);
  350.                             xsp_out();
  351.                             key_wait();
  352. #endif
  353.                         }}}}
  354.                     }
  355.                     /* オプションとの当たり判定 */
  356.                     for( j=0;j<2;j++ ){
  357.                         signed short option_w;
  358.                         if( hito_x1 <= (option_w = *((short *) (&pl->option[j].lx))) ){
  359.                         if( hito_x2 >=  option_w ){
  360.                         if( hito_y1 <= (option_w = *((short *) (&pl->option[j].ly))) ){
  361.                         if( hito_y2 >=  option_w ){
  362. #if 0
  363.                             B_CLR_AL();
  364.                             printf("OPTION_HIT!! %d   \n",k);
  365.                             printf("j=%d op_x=%d op_y=%d   \n",j,pl->option[j].lx>>16,pl->option[j].ly>>16);
  366.                             printf("e_x=%d e_x1=%d e_x2=%d  \n",ENE_X,hito_x1,hito_x2);
  367.                             printf("e_y=%d e_y1=%d e_y2=%d  \n",ENE_Y,hito_y1,hito_y2);
  368.                             xsp_out();
  369.                             key_wait();
  370. #endif
  371.                             ene->damage += PLAYER_OPTION_DAMAGE;
  372.                             ene->player=pl;                        /* ダメージを与えたプレイヤー */
  373.                             ene->damage_kind=OPTION_ATTACK;        /* オプションの体当たり */
  374.                         }}}}
  375.                     }
  376.                 }
  377.  
  378.                 /* ショットとの当たり判定 */
  379.                 for( shot = shot_top; shot; ){
  380.                     signed short shot_w;
  381.  
  382.                     if( (hits_x1-shot->hit_x) <= (shot_w=SHOT_X) ){
  383.                     if( (hits_x2+shot->hit_x) >=  shot_w ){
  384.                     if( (hits_y1-shot->hit_y) <= (shot_w=SHOT_Y) ){
  385.                     if( (hits_y2+shot->hit_y) >=  shot_w ){
  386.  
  387. #if 0
  388.                         B_CLR_AL();
  389.                         printf("SHOT_HIT!! %d   \n",k);
  390.                         printf("sx=%d sy=%d hx=%d hy=%d  \n",SHOT_X,SHOT_Y,shot->hit_x,shot->hit_y);
  391.                         printf("ex=%d ey=%d \n",ENE_X,ENE_Y);
  392.                         printf("ehx1=%d ehx2=%d ehy1=%d ehy2=%d  \n",
  393.                             ene->hit_s[k]->x1,ene->hit_s[k]->x2,
  394.                             ene->hit_s[k]->y1,ene->hit_s[k]->y2);
  395.                         printf("ex1=%d ex2=%d ey1=%d ey2=%d  \n",
  396.                             hits_x1,hits_x2,hits_y1,hits_y2);
  397.                         printf("ehx1=%d ehx2=%d ehy1=%d ehy2=%d  \n",
  398.                             hits_x1-shot->hit_x,hits_x2+shot->hit_x,
  399.                             hits_y1-shot->hit_y,hits_y2+shot->hit_y);
  400.                         xsp_out();
  401.                         OutBox();
  402.                         key_wait();
  403. #endif
  404.                         if(!shot->penetration)
  405.                             shot->damage = !0;        /* そのショットを使えなくする */
  406.                         ene->damage += shot->pow;
  407. /*                        ene->damage += shot_damage[shot->frame];*/
  408.                         ene->damage_kind=SHOT_ATTACK;        /* ショット */
  409.                     }}}}
  410.                     shot = shot->next;
  411.                 }
  412.             }
  413.             ene = ene->next;
  414.         }
  415.     }
  416. }
  417.  
  418.  
  419. /*
  420.  *        敵消滅
  421.  */
  422. ENEMY *EraseEnemy( ENEMY *ene )
  423. {
  424.     ENEMY *next;
  425.  
  426.     next = ene->next;
  427.     ene->type = 0;
  428.  
  429.     /* 使っているリストから抜く */
  430.     if ( ene->pre ) {
  431.         ene->pre->next = ene->next;
  432.         if ( ene->next ) ene->next->pre = ene->pre;
  433.     } else {
  434.         if ( ene->next ) ene->next->pre = 0;
  435.         enemy_top = ene->next;
  436.     }
  437.  
  438.     /* 空いているリストに入れる */
  439.     ene->pre = 0;
  440.     ene->next = enemy_free;
  441.     enemy_free = ene;
  442.  
  443.     return next;
  444. }
  445.